/*====================================================================================================*/
/*====================================================================================================*/
#include "drivers\stm32f3_system.h"
#include "drivers\stm32f3_adc.h"
#include "drivers\stm32f3_tim_pwm.h"

#include "uMultimeter.h"
#include "uMultimeter_probe.h"
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_PROBE_Config
**功能 : Probe Config
**輸入 : None
**輸出 : None
**使用 : UM_PROBE_Config();
**====================================================================================================*/
/*====================================================================================================*/
void UM_PROBE_Config( void )
{
  ADC_Config();

  TIM_PWM_Config();
  TIM_PWM_setDuty(0);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeOCH_Cmd
**功能 : Output Enable / Disable
**輸入 : state
**輸出 : None
**使用 : UM_ProbeOCH_Cmd(ENABLE);
**====================================================================================================*/
/*====================================================================================================*/
void UM_ProbeOCH_Cmd( FunctionalState state )
{
  UM_PROBE_DUTY = (state == ENABLE) ? UM_PROBE_ON : UM_PROBE_OFF;
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeOCH_SetDuty
**功能 : Set PWM Duty
**輸入 : channel, state
**輸出 : None
**使用 : UM_ProbeOCH_SetDuty(400);  // 40% duty
**====================================================================================================*/
/*====================================================================================================*/
void UM_ProbeOCH_SetDuty( uint16_t duty )
{
  TIM_PWM_setDuty(duty);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeOCH_SetFreq
**功能 : Set PWM Freq
**輸入 : channel, state
**輸出 : None
**使用 : UM_ProbeOCH_SetFreq(500); // 500 Hz
**====================================================================================================*/
/*====================================================================================================*/
//void UM_ProbeOCH_SetFreq( uint32_t freq )
//{
//  uint32_t perFreq = 0;
//  uint32_t tmpPeri = 0;

//  perFreq = (UM_PROBE_PULSE / (UM_PROBE_PERI + 1));
//  tmpPeri = perFreq / freq;
//  if(99 < tmpPeri < 59999) {
//    UM_PROBE_PULSE = tmpPeri - 1;
//    return;
//  }
//}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeOCH_GetDuty
**功能 : Get PWM Duty
**輸入 : None
**輸出 : duty
**使用 : duty = UM_ProbeOCH_GetDuty();
**====================================================================================================*/
/*====================================================================================================*/
//uint16_t UM_ProbeOCH_GetDuty( void )
//{
//  return (10000 - (UM_PROBE_DUTY * 10000.0f ) / (UM_PROBE_PULSE + 1));
//}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeOCH_GetFreq
**功能 : Get PWM Freq
**輸入 : None
**輸出 : freq
**使用 : freq = UM_ProbeOCH_GetFreq();
**====================================================================================================*/
/*====================================================================================================*/
//uint32_t UM_ProbeOCH_GetFreq( void )
//{
//  uint32_t freq = SystemCoreClock / (UM_PROBE_PERI + 1);

//  return (SystemCoreClock / (UM_PROBE_PERI + 1)) / (UM_PROBE_PULSE + 1);
//}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeICH_getADC
**功能 : get ADC Data
**輸入 : channel
**輸出 : adcData
**使用 : adc = UM_ProbeICH_getADC(channel);
**====================================================================================================*/
/*====================================================================================================*/
uint16_t UM_ProbeICH_getADC( uint8_t channel )
{
  return ADC_getData(channel);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UM_ProbeICH_getADC
**功能 : get ADC Data
**輸入 : channel
**輸出 : adcData
**使用 : adc = UM_ProbeICH_getADC(channel);
**====================================================================================================*/
/*====================================================================================================*/
uint16_t UM_ProbeICH_getAveADC( uint8_t channel )
{
  return ADC_getData(channel);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : ProbeICH_ReadAveADC
**功能 : 將 ADC 轉換後的資料取平均
**輸入 : *pADC_Ave
**輸出 : None
**使用 : ADC_AveData = ProbeICH_ReadADC(0);
**====================================================================================================*/
/*====================================================================================================*/
//#define MOVEAVE_LENGTH 4
//uint16_t ProbeICH_ReadAveADC( uint8_t Channel )
//{
//  static uint16_t moveAve_Buf[2][MOVEAVE_LENGTH] = {0};
//  const  uint16_t moveAve_Weighted[MOVEAVE_LENGTH] = {1, 2, 4, 9};  // sum = 16 = 2^4

//  uint16_t tmpData = 0;
//  uint32_t sumData = 0;

//  for(uint16_t i = 0; i < ADC_Sample; i++)
//    sumData += ProbeICH_ADC[i][Channel];
//  tmpData = (sumData >> ADC_SampleDiv);

//  sumData = 0;
//  for(uint8_t i = 0; i < MOVEAVE_LENGTH-1; i++)
//    moveAve_Buf[Channel][i] = moveAve_Buf[Channel][i+1];
//  moveAve_Buf[Channel][MOVEAVE_LENGTH-1] = tmpData;
//  for(uint8_t i = 0; i < MOVEAVE_LENGTH; i++)
//    sumData += moveAve_Buf[Channel][i] * moveAve_Weighted[i];

//  return (uint16_t)(sumData >> 4);
//}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : uMultimeter_measure_ADCtoVol
**功能 : 
**輸入 : adcData
**輸出 : None
**使用 : tmpData = uMultimeter_measure_ADCtoVol(readData);
**====================================================================================================*/
/*====================================================================================================*/
#define VADC            3300.0  // 3300mV
#define ADC_R1          15000   // 15K
#define ADC_R2          2000    //  2K
#define VIN_MAX         (VADC * (ADC_R1 + ADC_R2) / ADC_R2)   //  2K
#define ADC_RESOLUTION  (6.84814453125) // (VIN_MAX / 4096)

uint16_t UM_PROBE_ADCtoVol( uint16_t adcData )
{
  return (uint16_t)(adcData * ADC_RESOLUTION + 0.5);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : uMultimeter_measure_ADCtoRes
**功能 : 
**輸入 : adcData
**輸出 : None
**使用 : tmpData = uMultimeter_measure_ADCtoRes(readData);
**====================================================================================================*/
/*====================================================================================================*/
//uint32_t uM_measure_ADCtoRes( uint16_t adcData )
//{
//  return (uint32_t)(adcData * Vol_R1R2 + 0.5f);
//}
/*====================================================================================================*/
/*====================================================================================================*/
